package com.ruoyi.proposal.service.impl;

import com.ruoyi.proposal.domain.Proposal;
import com.ruoyi.proposal.dto.ProposalDTO;
import com.ruoyi.proposal.dto.ProposalQueryDTO;
import com.ruoyi.proposal.mapper.ProposalMapper;
import com.ruoyi.proposal.service.ProposalService;
import com.ruoyi.proposal.vo.ProposalVO;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.utils.PageUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 提案服务实现类
 */
@Service
public class ProposalServiceImpl implements ProposalService {

    @Autowired
    private ProposalMapper proposalMapper;

    /**
     * 提交提案
     *
     * @param proposalDTO 提案数据传输对象
     */
    @Override
    public void submitProposal(ProposalDTO proposalDTO) {
        // 将DTO转换为Domain对象
        Proposal proposal = new Proposal();
        BeanUtils.copyProperties(proposalDTO, proposal);

        // 插入提案记录
        proposalMapper.insert(proposal);
    }

    /**
     * 查询所有提案
     *
     * @param queryDTO 查询条件
     * @return 提案列表
     */
    @Override
    public List<ProposalVO> findAllProposals(ProposalQueryDTO queryDTO) {
        // 判断是否包含查询条件
        boolean hasCondition = (queryDTO.getStatus() != null && !queryDTO.getStatus().isEmpty()) ||
                (queryDTO.getMonth() != null && !queryDTO.getMonth().isEmpty()) ||
                (queryDTO.getDepartmentName() != null && !queryDTO.getDepartmentName().isEmpty()) ||
                (queryDTO.getProposerName() != null && !queryDTO.getProposerName().isEmpty());

        List<Proposal> proposals;
        if (hasCondition) {
            // 有条件时按条件查询
            proposals = proposalMapper.selectByCondition(queryDTO);
        } else {
            // 无条件时查询所有记录
            proposals = proposalMapper.selectAll();
        }

        // 将Domain对象转换为VO对象
        return proposals.stream()
                .map(proposal -> {
                    ProposalVO proposalVO = new ProposalVO();
                    org.springframework.beans.BeanUtils.copyProperties(proposal, proposalVO);
                    return proposalVO;
                })
                .collect(Collectors.toList());
    }

    /**
     * 分页查询所有提案
     *
     * @param queryDTO 查询条件
     * @return 提案分页数据
     */
    @Override
    public TableDataInfo findProposalList(ProposalQueryDTO queryDTO) {
        // 使用PageHelper处理分页
        PageHelper.startPage(queryDTO.getPageNum(), queryDTO.getPageSize());

        // 判断是否包含查询条件
        boolean hasCondition = (queryDTO.getStatus() != null && !queryDTO.getStatus().isEmpty()) ||
                (queryDTO.getMonth() != null && !queryDTO.getMonth().isEmpty()) ||
                (queryDTO.getDepartmentName() != null && !queryDTO.getDepartmentName().isEmpty()) ||
                (queryDTO.getProposerName() != null && !queryDTO.getProposerName().isEmpty()) ||
                (queryDTO.getScoreStatus() != null && !queryDTO.getScoreStatus().isEmpty());

        List<Proposal> proposals;
        if (hasCondition) {
            // 有条件时按条件查询
            proposals = proposalMapper.selectByCondition(queryDTO);
        } else {
            // 无条件时查询所有记录
            proposals = proposalMapper.selectAll();
        }

        // 创建PageInfo对象以获取分页信息
        PageInfo<Proposal> pageInfo = new PageInfo<>(proposals);

        // 将Domain对象转换为VO对象
        List<ProposalVO> proposalVOs = proposals.stream()
                .map(proposal -> {
                    ProposalVO proposalVO = new ProposalVO();
                    org.springframework.beans.BeanUtils.copyProperties(proposal, proposalVO);
                    return proposalVO;
                })
                .collect(Collectors.toList());

        // 构造分页数据
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(200);
        rspData.setMsg("查询成功");
        rspData.setRows(proposalVOs);
        rspData.setTotal(pageInfo.getTotal());
        return rspData;
    }

    /**
     * 根据ID查询提案
     *
     * @param id 提案ID
     * @return 提案对象
     */
    @Override
    public ProposalVO findById(Long id) {
        Proposal proposal = proposalMapper.selectById(id);
        ProposalVO proposalVO = new ProposalVO();
        BeanUtils.copyProperties(proposal, proposalVO);
        return proposalVO;
    }

    /**
     * 根据条件查询提案记录总数
     * @param queryDTO 查询条件
     * @return 记录总数
     */
    @Override
    public int countByCondition(ProposalQueryDTO queryDTO) {
        return proposalMapper.countByCondition(queryDTO);
    }

    /**
     * 更新提案
     *
     * @param proposalDTO 提案数据传输对象
     */
    @Override
    public void updateProposal(ProposalDTO proposalDTO) {
        // 将DTO转换为Domain对象
        Proposal proposal = new Proposal();
        BeanUtils.copyProperties(proposalDTO, proposal);

        // 更新提案记录
        proposalMapper.updateById(proposal);
    }

    /**
     * 删除提案
     *
     * @param id 提案ID
     */
    @Override
    public void deleteProposal(Long id) {
        proposalMapper.deleteById(id);
    }

    /**
     * 查询财务相关提案
     *
     * @param queryDTO 查询条件
     * @return 提案列表
     */
    @Override
    public List<ProposalVO> findFinanceProposals(ProposalQueryDTO queryDTO) {
        com.github.pagehelper.PageHelper.startPage(queryDTO.getPageNum(), queryDTO.getPageSize());
        List<Proposal> proposals = proposalMapper.selectFinanceProposals(queryDTO);

        // 将Domain对象转换为VO对象
        return proposals.stream()
                .map(proposal -> {
                    ProposalVO proposalVO = new ProposalVO();
                    org.springframework.beans.BeanUtils.copyProperties(proposal, proposalVO);
                    return proposalVO;
                })
                .collect(Collectors.toList());
    }

    /**
     * 更新节省金额
     *
     * @param proposalDTO 提案数据传输对象
     */
    @Override
    public void updateSavings(ProposalDTO proposalDTO) {
        // 将DTO转换为Domain对象
        Proposal proposal = new Proposal();
        BeanUtils.copyProperties(proposalDTO, proposal);

        // 更新节省金额
        proposalMapper.updateById(proposal);
    }

    /**
     * 查询待打分提案
     *
     * @param queryDTO 查询条件
     * @return 提案列表
     */
    @Override
    public List<ProposalVO> findScoreProposals(ProposalQueryDTO queryDTO) {
        com.github.pagehelper.PageHelper.startPage(queryDTO.getPageNum(), queryDTO.getPageSize());
        // 查询待打分提案记录
        List<Proposal> proposals = proposalMapper.selectScoreProposals(queryDTO);

        // 将Domain对象转换为VO对象
        return proposals.stream()
                .map(proposal -> {
                    ProposalVO proposalVO = new ProposalVO();
                    BeanUtils.copyProperties(proposal, proposalVO);
                    return proposalVO;
                })
                .collect(Collectors.toList());
    }

    /**
     * 分页查询待打分提案
     *
     * @param queryDTO 查询条件
     * @return 提案分页数据
     */
    @Override
    public TableDataInfo findScoreProposalList(ProposalQueryDTO queryDTO) {
        // 使用PageHelper处理分页
        PageHelper.startPage(queryDTO.getPageNum(), queryDTO.getPageSize());

        // 查询待打分提案记录
        List<Proposal> proposals = proposalMapper.selectScoreProposals(queryDTO);

        // 创建PageInfo对象以获取分页信息
        PageInfo<Proposal> pageInfo = new PageInfo<>(proposals);

        // 将Domain对象转换为VO对象
        List<ProposalVO> proposalVOs = proposals.stream()
                .map(proposal -> {
                    ProposalVO proposalVO = new ProposalVO();
                    org.springframework.beans.BeanUtils.copyProperties(proposal, proposalVO);
                    return proposalVO;
                })
                .collect(Collectors.toList());

        // 构造分页数据
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(200);
        rspData.setMsg("查询成功");
        rspData.setRows(proposalVOs);
        rspData.setTotal(pageInfo.getTotal());
        return rspData;
    }

    /**
     * 提交评分
     *
     * @param proposalDTO 提案数据传输对象
     */
    @Override
    public void submitScore(ProposalDTO proposalDTO) {
        // 将DTO转换为Domain对象
        Proposal proposal = new Proposal();
        BeanUtils.copyProperties(proposalDTO, proposal);

        // 更新提案评分
        proposalMapper.updateById(proposal);
    }
}